TJCLCounter - VYSOKA nepresnost hodnot
Otázka od: Karel Kimes
17. 9. 2002 17:34
ahoj,
mam problem s presnosti TJCLCounter. Dival sem se, ze tento objekt vyuziva
QueryPerformanceFrequency a QueryPerformanceCounter.
QueryPerformanceFrequency mne vraci frekvenci 3579454 (Hz), ALE!!!
procedure TForm1.Btn_MeasureClick(Sender: TObject);
begin
FCounter.Start;
Sleep(5000); // 5s
ShowMessage(FloatToStr(FCounter.Stop)); // ******* ---> zobrazi hodnotu
od 0,882... do 0,889...
end;
nebo
procedure TForm1.Btn_MeasureClick(Sender: TObject);
begin
FCounter.Start;
Sleep(60000); // 60s
ShowMessage(FloatToStr(FCounter.Stop)); // ******* ---> zobrazi
hodnotu 10,336...
end;
Zajimave je, ze "rozdilovy pomer" (ufff, co sem to vyplodil, doufam, ze
fsichni pochopite, co tim myslim), tedy KONSTANTA = HODNOTA_SLEEP /
NAMERENA_HODNOTA, se jevi jako konstantni. Konstantu sem spocetl zhruba na
cca 5,805.
Proc mne to nevraci uplynuly cas v [s]? Proc musim vysledek nasobit touto
konstantou, ktera (NENI ODZKOUSENO), se muze na ruznych PC lisit?
Mj. zkousel sem to napsat i takhle a vysledek byl stejnej.
procedure TForm1.Btn_MeasureClick(Sender: TObject);
var
freq, start_time, end_time : Int64;
begin
if not QueryPerformanceFrequency(freq) then
RaiseLastOSError;
if not QueryPerformanceCounter(start_time) then
RaiseLastOSError;
Sleep(5000);
if not QueryPerformanceCounter(end_time) then
RaiseLastOSError;
ShowMessage(FloatToStr((end_time - start_time) / freq));
end;
WinXP, D6PRO UPDATE 02
kchodl
Odpovedá: Delphin
19. 9. 2002 13:00
QueryPerformanceFrequency a QueryPerformanceCounter pouziva specialni hw
prostredky, ktere mohou byt ruzne na kazdem typu procesoru a zrejme ne pro
vsechny to funguje spravne. Na Celeronu 1 GHz je vysledek po sleep(5000)
4.98... .
Odpovedá: Vaclav Sazima
19. 9. 2002 14:20
Ja bych cekal spis nepresnost toho Sleepu, uz z toho, co vlastne dela.
Vaclav Sazima
Delphin wrote:
>
> QueryPerformanceFrequency a QueryPerformanceCounter pouziva specialni hw
> prostredky, ktere mohou byt ruzne na kazdem typu procesoru a zrejme ne pro
> vsechny to funguje spravne. Na Celeronu 1 GHz je vysledek po sleep(5000)
> 4.98... .